package org.bigjava.novelplatform;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.file.FileAppender;
import cn.hutool.core.io.file.FileNameUtil;
import cn.hutool.core.io.file.FileReader;
import cn.hutool.core.util.StrUtil;
import org.bigjava.novelplatform.common.utils.RedisUtils;
import org.bigjava.novelplatform.controller.WriterController;
import org.bigjava.novelplatform.entity.Books;
import org.bigjava.novelplatform.entity.Chapter;
import org.bigjava.novelplatform.entity.Users;
import org.bigjava.novelplatform.mapper.BooksMapper;
import org.bigjava.novelplatform.mapper.ChapterMapper;
import org.bigjava.novelplatform.mapper.UsersMapper;
import org.bigjava.novelplatform.service.CommonService;
import org.bigjava.novelplatform.service.WriterService;
import org.bigjava.novelplatform.service.impl.*;
import org.bigjava.novelplatform.vo.BookVoList;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.annotation.Rollback;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.io.File;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Clock;
import java.time.Duration;
import java.time.LocalTime;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import static org.bigjava.novelplatform.common.constant.ComplexConstant.RESOURCE_PATH;
import static org.bigjava.novelplatform.common.enums.PublishState.PUBLISHED;
import static org.bigjava.novelplatform.common.enums.PublishState.UNPUBLISHED;
import static org.bigjava.novelplatform.common.enums.VerifyState.PASS_VERIFY;


//随机端口
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
//web
@AutoConfigureMockMvc
//关闭事务
@Transactional
//自动回滚，不提交事务
@Rollback(false)
public class test1 {
    @Resource
    UserServiceImpl userService;
    @Resource
    RecommendServiceImpl recommendService;
    @Resource
    RedisUtils redisUtils;
    @Resource
    WriterService writerService;
    @Resource
    CommonService commonService;
    @Resource
    AdminServiceImpl adminService;
    @Resource
    private UsersMapper usersMapper;
    @Resource
    private AuthorBookServiceImpl authorBookService;
    @Resource
    private BooksMapper booksMapper;
    @Resource
    private AuthorChapterServiceImpl authorChapterService;
    @Resource
    private ChapterMapper chapterMapper;

    static boolean f(String owner) {
        String check = "\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*";
        Pattern regex = Pattern.compile(check);
        //是否匹配
        Matcher matcher = regex.matcher(owner);
        boolean matches = matcher.matches();
        return matches;
    }

    @Test
    void ttt() {
//        writerService.selectBook(24, userInfoVo.getId());

    }

    @Test
    void datec() throws ParseException {
        Duration duration = Duration.ofMillis(100).plusMillis(60 * 5);
        System.out.println(duration.toMillis());
    }

    @Test
    void datea() throws ParseException {
        SimpleDateFormat format = new SimpleDateFormat("HH:mm");
        Date parse = format.parse("12:16");
        Date parse1 = format.parse(format.format(new Date()));

        long nanos = parse1.getTime() - parse.getTime();
        System.out.println(nanos);
    }

    @Test
    void date() {
        LocalTime start = LocalTime.now();
        LocalTime end = LocalTime.of(12, 30);
        Duration between = Duration.between(start, end);
        long nanos = between.toMillis();
        System.out.println(nanos);
    }

    @Test
    public void regx() {
        int count = 0;
// String to be scanned to find the pattern.
        String content = "<p><br></p>" +
                "<p>&nbsp;&nbsp;汪淼觉得，来找他的这四个人是一个奇怪的组合：两名警察和两名军人，如果那两个军人是武警还算正常，但这是两名陆军军官。</p>\n" +
                "<p><br></p>" +
                "<p>&nbsp;&nbsp;汪淼第一眼就对来找他的警察没有好感。其实那名穿警服的年轻人还行，举止很有礼貌，但那位便衣就让人讨厌了。这人长得五大三粗，一脸横肉，穿着件脏兮兮的皮夹克，浑身烟味，说话粗声大嗓，是最令汪淼反感的那类人。</p>" +
                "<p><br></p>" +
                "<p>&nbsp;&nbsp;“汪淼？”那人问，直呼其名令汪淼很不舒服，况且那人同时还在点烟，头都不抬一下。不等汪淼回答，他就向旁边那位年轻人示意了一下，后者向汪淼出示了警官证，他点完烟后就直接向屋里闯。</p>" +
                "<p><br></p>" +
                "<p>&nbsp;&nbsp;“请不要在我家里抽烟。”汪淼拦住了他。</p>" +
                "<p><br></p>" +
                "<p>&nbsp;&nbsp;“哦，对不起，汪教授。这是我们史强队长。”年轻警官微笑着说，同时对姓史的使了个眼色。</p>" +
                "<p><br></p>" +
                "<p>&nbsp;&nbsp;“成，那就在楼道里说吧。”史强说着，深深地吸了一大口，手中的烟几乎燃下去一半，之后竟不见吐出烟来。“你问。”他又向年轻警官偏了一下头。</p>" +
                "<p><br></p>" +
                "<p>&nbsp;&nbsp;“汪教授，我们是想了解一下，最近你与‘科学边界’学会的成员有过接触，是吧？”</p>" +
                "<p><br></p>" +
                "<p>&nbsp;&nbsp;“‘科学边界’是一个在国际学术界很有影响的学术组织，成员都是著名学者。这样一个合法的学术组织，我怎么就不能接触了呢？”</p>" +
                "<p><br></p><p>&nbsp;&nbsp;“你看看你这个人！”史强大声说，“我们说它不合法了吗？我们说不让你接触了吗？”他说着，刚才吸进肚子里的烟都喷到汪淼脸上。</p><p><br></p><p>&nbsp;&nbsp;“那好，这属于个人隐私，我没必要回答你们的问题。”</p><p><br></p><p>&nbsp;&nbsp;“还啥都成隐私了，像你这样一个著名学者，总该对公共安全负责吧。”史强把手中的烟头扔掉，又从压扁了的烟盒里抽出一根。</p><p><br></p><p>&nbsp;&nbsp;“我有权不回答，你们请便吧。”汪淼说着要转身回屋。</p><p><br></p><p>&nbsp;&nbsp;“等等！”史强厉声说，同时朝旁边的年轻警官挥了一下手，“给他地址和电话，下午去走一趟。”</p><p><br></p><p>&nbsp;&nbsp;“你要干什么！”汪淼愤怒地质问，这争吵引得邻居们也探出头来，想看看出了什么事。</p><p><br></p><p>&nbsp;&nbsp;“史队！你说你”年轻警官生气地将史强拉到一边，显然他的粗俗不止是让汪淼一人不适应。</p><p><br></p><p>&nbsp;&nbsp;“汪教授，请别误会。”一名少校军官急忙上前，“下午有一个重要会议，要请几位学者和专家参加，首长让我们来邀请您。”</p><p><br></p><p>&nbsp;&nbsp;“我下午很忙。”</p><p><br></p><p>&nbsp;&nbsp;“这我们清楚，首长已经向超导中心领导打了招呼。这次会议上不能没有您，实在不行，我们只有把会议延期等您了。”</p><p><br></p><p>&nbsp;&nbsp;史强和他的同事没再说话，转身下楼了，两位军官看着他们走远，似乎都长出了一口气。</p><p><br></p><p>&nbsp;&nbsp;“这人怎么这样儿。”少校小声对同事说。</p><p><br></p><p>&nbsp;&nbsp;“他劣迹斑斑，前几年在一次劫持人质事件中，他不顾人质的死活擅自行动，结果导致一家三口惨死在罪犯手中；据说他还和黑社会打得火热，用一帮黑道势力去收拾另一帮；去年又搞刑讯逼供，使一名嫌疑人致残，因此被停职了……”</p><p><br></p><p>&nbsp;&nbsp;“这种人怎么能进作战中心？”</p><p><br></p><p>&nbsp;&nbsp;“首长点名要他，应该有什么过人之处吧。不过，对他限制挺严，除了公安方面的事务，几乎什么都不让他知道。”</p><p><br></p><p>&nbsp;&nbsp;作战中心？那是什么？汪淼不解地看着面前的两位军官。</p><p><br></p><p>&nbsp;&nbsp;接汪淼的汽车驶进了城市近郊的一座大院，从那只有门牌号码没有单位名牌的大门，汪淼知道这里是军方而不是警方的地盘。</p><p><br></p><p>&nbsp;&nbsp;会议是在一个大厅里举行的，汪淼一进去就对这里的纷乱吃惊不小。大厅周围是一圈胡乱安放的电脑设备，有的桌子上放不下就直接搁地板上，电线和网线纠缠着散在地上；一大摞网络交换机没有安在机架内，而是随手堆放在服务器上；有好几个投影仪的大屏幕，在大厅的角落里呈不同角度随意立着，像吉普赛人的帐篷；烟雾像晨雾般在半空浮了一层……汪淼不知道这是否就是那名军官所说的作战中心，有一点他可以肯定：这里在处理的事情，已经让人们顾不上其他了。</p><p><br></p><p>&nbsp;&nbsp;临时拼凑的会议桌上也是堆满了文件和杂物，与会者大多神情疲惫，衣服皱巴巴的，有领带的都扯开了，好像熬了一夜。主持会议的是一位叫常伟思的陆军少将，与会者有一半是军人。经过简单的介绍，他知道还有少部分警方人员，其他的人都是和他一样参加会议的专家学者，其中有几位还是很有名望的科学家，而且是研究基础科学的。</p><p><br></p><p>&nbsp;&nbsp;令他感到意外的是还有四个外国人，这些人的身份令他大吃一惊：其中的两个人也是军人，分别是美军空军上校和英国陆军上校，职务是北约联络员；另外两人居然是美国中央情报局的官员，在这里的职务是什么观察员。</p><p><br></p><p>&nbsp;&nbsp;从所有人的脸上，汪淼都读出了一句话：我们已经尽力了，快他妈的结束吧！</p><p><br></p><p>&nbsp;&nbsp;汪淼看到了史强，他倒是一反昨天的粗鲁，向汪淼打招呼，但那一脸傻笑让汪淼愉快不起来。他不想挨史强坐，但也只有那一个空位，他只好坐过去，屋里本来已经很浓的烟味更加重了。</p><p><br></p><p>&nbsp;&nbsp;发文件时，史强凑近汪淼说：“汪教授，你好像是在研究什么……新材料？”</p><p><br></p><p>&nbsp;&nbsp;“纳米材料。”汪淼简单地回答。</p><p><br></p><p>&nbsp;&nbsp;“我听说过，那玩意儿强度很高，不会被用于犯罪吧？”从史强那带有一半调侃的表情上，汪淼看不出他是不是开玩笑。</p><p><br></p><p>&nbsp;&nbsp;“什么意思？”</p><p><br></p><p>&nbsp;&nbsp;“呵，听说那玩意儿一根头发丝粗就能吊起一辆大卡车，犯罪分子要是偷点儿去做把刀，那一刀就能把一辆汽车砍成两截吧。”</p><p><br></p><p>&nbsp;&nbsp;“哼，根本不用做成刀，用那种材料做一根只有头发丝百分之一粗细的线，拦在路上，就能把过往的汽车像切奶酪那样切成两半……啥不能用于犯罪？刮鱼鳞的刀都能！”</p><p><br></p><p>&nbsp;&nbsp;史强把面前的文件从袋中抽出一半又塞了回去，显然没了兴趣。“说得对，鱼都能犯罪呢！我办过一个杀人案，一个娘们儿把她丈夫的那玩意儿割下来了。知道用的是什么？冰箱里冷冻的罗非鱼！鱼冻硬后，背上的那排刺就跟一把快刀似的……”</p><p><br></p><p>&nbsp;&nbsp;“我没兴趣，怎么，让我来开会就是为这事儿？”</p><p><br></p><p>&nbsp;&nbsp;“鱼？纳米材料？不、不，与那些都没关系。”史强把嘴凑到汪淼耳边，“别给这帮家伙好脸，他们歧视咱们，只想从咱们这里掏情报，但什么都不告诉咱们。像我，在这儿混了一个多月，还和你一样什么都不知道。”</p><p><br></p><p>&nbsp;&nbsp;“同志们，会议开始。”常伟思将军说，“在全球各战区，我们这里现在成为焦点。首先把当前情况向与会的同志们介绍一下。”</p><p><br></p><p>&nbsp;&nbsp;“战区”这个不寻常的术语令汪淼迷惑，他还注意到，首长好像并没有打算向他这样的新人介绍来龙去脉，这倒是印证了史强的话。在常将军这简短的开场白中，他两次提到了“同志们”，汪淼看看对面的两名北约军人和两个美国中情局官员，感觉将军似乎漏掉了“先生们”。</p><p><br></p><p>&nbsp;&nbsp;“他们也是同志，反正这边的人都是这么称呼的。”史强低声地对汪淼说，同时用手中的烟指了指那四个外国人。</p><p><br></p><p>&nbsp;&nbsp;在迷惑的同时，汪淼对史强的观察力留下了些印象。</p><p><br></p><p>&nbsp;&nbsp;“大史，你把烟熄了，这儿的烟味够浓了。”常伟思说，低头翻着文件。</p><p><br></p><p>&nbsp;&nbsp;史强拿着刚点着的烟四下看看，没找到烟灰缸，就“吱啦”一声扔到茶杯里了。他抓住这个机会举手要求发言，没等常伟思表态就大声说道：“首长，我提个要求，以前提过的信息对等！”</p><p><br></p><p>&nbsp;&nbsp;常伟思将军抬起头，“没有任何一个军事行动是信息对等的，这点也请到会的专家学者们谅解，我们不可能给你们介绍更多的背景资料。”</p><p><br></p><p>&nbsp;&nbsp;“但我们不一样。”史强说，“警方从作战中心成立之初就一直参与，可直到现在，我们连这个机构到底是干什么的都不知道。而且，你们正在把警方排挤出去，你们一步步熟悉我们的工作，然后把我们一个个赶走。”</p><p><br></p><p>&nbsp;&nbsp;与会的另外几名警官都在低声制止史强。史强敢对常伟思这样级别的首长这么说话，汪淼有些吃惊，而后者的反击更犀利。</p><p><br></p><p>&nbsp;&nbsp;“我说大史，现在看来，你在部队上的老毛病还没改。你能代表警方吗？你因为自己的恶劣行为已被停职好几个月了，马上就要被清除出公安队伍。我调你来，是看重你在城市警务方面的经验，你要珍惜这次机会。”</p><p><br></p><p>&nbsp;&nbsp;大史用粗嗓门说：“那我是戴罪立功了？你们不是说那都是些歪门邪道的经验吗？”</p><p><br></p><p>&nbsp;&nbsp;“但有用。”常伟思对史强点点头，“有用就行，现在顾不上那么多了，这是战争时期。”</p><p><br></p><p>&nbsp;&nbsp;“什么都顾不了了，”一位中情局的情报官员用标准的普通话说，“我们不能再用常规思维。”</p><p><br></p><p>&nbsp;&nbsp;那位英军上校显然也能听懂中文，他点点头，“Tobeornottobe……”</p><p><br></p><p>&nbsp;&nbsp;“他说什么？”史强问汪淼。</p><p><br></p><p>&nbsp;&nbsp;“没什么。”汪淼机械地回答。这些人似乎在梦呓，战争时期？战争在哪儿？他扭头望向大厅的落地窗，透过窗子可以看到远处大院外面的城市：春天的阳光下，街道上车流如织；草坪上有人在遛狗，还有几个孩子在玩耍……</p><p><br></p><p>&nbsp;&nbsp;里面和外面的世界，哪个更真实？</p>";
        String regex = "</p>";
// Create a Pattern object
        Pattern p = Pattern.compile(regex);
// get a matcher object
        Matcher m = p.matcher(content);
        while (m.find()) {
            count++;
            System.out.println("Match no:" + count);
            System.out.println("Found at: " + m.start() + " - " + m.end());
        }


    }

    //注册测试
    @Test
    public void lgoin() {
        Users users = new Users();
        users.setEmail("508388068@qq.com");
        users.setPassword("123123");
        users.setNickName("wenhao");

        //邮件是否发送成功
        if (userService.sendMailRegister(users.getEmail())) {
            //从数据库中获取发送的验证码
            String s = usersMapper.selectUserByEmail(users.getEmail()).getAuthCode();
            String[] ss = s.split("_");
            //相当于获取从前台获取的验证码
            users.setAuthCode(ss[1]);
            //注册，返回user对象
            System.out.println(userService.register(users));
        }
    }

    @Test
    public void booktest1() {
        for (int i = 1; i <= 10; i++) {//创建10本书
            Books books = new Books();
            books.setBookName("测试书名" + i);
            books.setWriterId(16);//虚构作者id
            System.out.println(authorBookService.publishBooks(books, 16));
        }
    }

    @Test
    public void booktest2() {//创建10篇章节默认未发布
        String s = RESOURCE_PATH;

        for (int i = 1; i <= 10; i++) {
            Chapter chapter = new Chapter();
            chapter.setBookId(1);//将章节添加到哪本书中
            chapter.setTitle("测试章节标题" + i);
            String content = chapter.getTitle() + "\n这是第" + i + "章节";
            System.out.println(authorChapterService.addChapter(chapter, content));
        }
    }

    @Test
    public void booktest3() {//发布章节
        for (int i = 1; i <= 5; i++) {
            System.out.println(authorChapterService.releaseChapter(Long.valueOf(i)));
        }
    }

    @Test
    void test() {

        String url = RESOURCE_PATH + "FileTest/testfile.txt";
        File file = FileUtil.file(url);
        if (!file.exists()) FileUtil.touch(url);
        FileAppender appender = new FileAppender(file, 16, true);
        appender.append("123");
        appender.append("abc");
        appender.append("xyz");
        appender.flush();
        System.out.println(appender);
        System.out.println(FileUtil.getTotalLines(file));
        System.out.println(FileUtil.getUserHomePath());

/*        for (File l : FileUtil.ls(RESOURCE_PATH+"BookWarehouse/")) {
            System.out.println(l.getName());
        }*/

    }

    @Test
    void test2() {
//        StrBuilder builder = StrBuilder.create();
//        builder.append("aaa").append("你好").append('r');
//        System.out.println(builder);

/*        for (Chapter chapter : chapterMapper.selectByBookId(1, 5)) {
            System.out.println(chapter.getTitle()+chapterMapper.selectDeleteStateInteger(chapter.getId()));
        }*/

        String url1 = "D:/";
        File srcFile = FileUtil.file(url1 + "ds.txt");
        File datFile = FileUtil.file(url1 + "DeletedChapter");
/*        for (int i = 0; i < 10; i++) {
            FileUtil.copy(srcFile,datFile, true);
            File file = FileUtil.file(url1 + "DeletedChapter/1_测试章节标题.txt");
            FileUtil.rename(file, "已删除的名字" + System.currentTimeMillis() + ".txt", false);
        }*/


        String parentPath = srcFile.getParent();
        System.out.println(FileNameUtil.getName(srcFile));

        System.out.println(FileNameUtil.getPrefix(srcFile));
//        FileUtil.rename(srcFile, "已删除的名字" + System.currentTimeMillis() + ".txt", false);
//        System.out.println(FileNameUtil.getPrefix(srcFile));

        File file = FileUtil.file(url1 + "/test/");
        FileUtil.move(srcFile, file, true);

        System.out.println("该目录的上级目录为：" + parentPath);
    }

    @Test
    void test3() {
//        booktest1();//添加10本书给id为16用户
//        booktest2();//添加10文章给id为1书籍(默认未发布)

        //删除指定id的章节
//        Chapter chapter = chapterMapper.selectChapter(5L);
//        System.out.println(authorChapterService.deleteChapter(chapter));

        Chapter chapter1 = chapterMapper.selectChapter(3L);
        System.out.println(authorChapterService.modifiedSection(chapter1, "测试追加模式", false));
//
//        Chapter chapter2 = chapterMapper.selectChapter(4L);
//        System.out.println(authorChapterService.modifiedSection(chapter2, "测试覆盖模式", true));

    }

    @Test
    void test4() {
//        Integer.parseInt("520");
//        Integer.valueOf("520");

//        String url = "C:/Users/XMZR/Desktop/resource/BookWarehouse/1/测试书名1.txt";
//        System.out.println(FileUtil.getParent(url, 1));
//
//        String name = System.currentTimeMillis() + "_a_b.txt";
//        for (String s : AuthorChapterServiceImpl.fileNameFormatting(name)) {
//            System.out.println(s);
//        }
//        for (String s : authorChapterService.getChangedData(1)) {
//            System.out.println(s);
//        }

        System.out.println(authorChapterService.restoreHistory(1, "1652444073611_5_测试章节标题5"));


    }

    @Test
    void test5() {
        Chapter chapter1 = new Chapter();
        chapter1.setId(5L);
        Chapter chapter = chapterMapper.selectById(chapter1);
        System.out.println(chapter);
    }

    @Test
    void Test6() {

//        List<String> str = authorChapterService.getChapterHistory(3L);
//        for (String s : str) {
//            System.out.println(s);
//        }

/*        System.out.println(authorChapterService.keepChapter(10L,1));
        System.out.println(authorChapterService.keepChapter(Long.valueOf(10),1));*/


        String fileName = "1652444073629_3_测试章节标题3";
        String[] list = fileName.split("_");
        String bookUrl = authorChapterService.getChapterUrlById(Long.valueOf(list[1]));
        String chapterUrl = bookUrl + "\\DeletedChapter\\" + fileName + ".txt";
        File file = FileUtil.file(chapterUrl);
        if (!file.exists()) System.out.println("文件不存在");
        ;
        FileReader fileReader = new FileReader(file);
        System.out.println(StrUtil.builder(fileReader.readString()));


        for (String s : authorChapterService.getChapterDeleted(1)) {
            System.out.println(s);
        }
    }

    @Test
    void test7() {
//        Map<String,ArrayList<String>> map = new HashMap<String,ArrayList<String>>();
//        final ArrayList<String> strings = new ArrayList<String>();
//        strings.add("123");strings.add("123");strings.add("123");
//        map.put("1",strings);
//
//
////        final Map map1 = redisUtils.parseJsonToObject("BOOK_REDIS_KEY_LIST", Map.class);
////        System.out.println(map1);
//
//        HashMap<String, ArrayList<String>> listMap = new HashMap<>();
//        redisUtils.set(map,"map",null);

//        Map<String,List<String>> map1 = redisUtils.parseJsonToMap("map", String.class);
//        System.out.println(map1);
//        final Object o = map1.get("1");
//
//        final ArrayList<String> strings = new ArrayList<String>();
//        strings.add("122223");
//        strings.add("122223");
//        strings.add("122223");
//        map1.put("2",strings);
//
//        redisUtils.set(map1,"map",null);

//        Map<String,List<Integer>> map2 = redisUtils.parseJsonToMap("map", Integer.class);
//        System.out.println(map2);

//        List<String> list = recommendService.getRecommendList();
//        System.out.println(list.size());
//
//        for (String s : list) {
//            System.out.println(recommendService.getBodyByKey(s));
//        }

    }

    @Test
    void test8() {
        List<Integer> list = adminService.getDownholeCount(5);
//        System.out.println(list.size());
        System.out.println(1 / 2);
    }

    @Test
    void test9() {


    }
}
